home *** CD-ROM | disk | FTP | other *** search
- static char readdate_prog[] = "@(#)char *readdate(int f, char *dstr) - Datum einlesen";
- static char readdate_ver[] = "@(#)v1.10/kr ; 21.07.91";
- /* readdate Einlesen eines Datum-String
- **
- ** Autor Klaus Rath
- **
- ** Deklaration char *readdate(int format, char *datestring);
- **
- ** Compilation DOS: bcc -c readdate.c c:\usr\local\lib\libkrc_s.lib
- ** UNIX: cc -c readdate.c /u1/usr/lib/libkrc.a
- ** ( unter DOS kann die Funktion im small-Modell laufen )
- **
- ** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
- ** chem Format eingelesen werden soll.
- ** Z.Zt. erlaubte Formate (siehe datum.h) :
- ** tt.mm.[jj]jj -- Deutsches Format (format: 1,2)
- ** mm/tt/[jj]jj -- Amerikanisches Format (format: 3,4)
- ** [jj]jjmmtt -- Datenbankformat DDB/4 (format: 5,6)
- ** tt.mm. | mm/tt -- Kurzformat deutsch/am. (format: 7,8).
- ** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
- ** des Ergebnisses erwartet.
- **
- ** Rückgabe (char *) auf datestring
- **
- ** Anmerkungen Die Funktion prüft nicht die Validität des eingegebenen
- ** Datums - dies sollte die aufrufende Funktion selbst tun,
- ** bzw. den Test durch checkdate() durchführen lassen.
- ** Die Funktion benutzt zum Einlesen eine Funktion
- ** int editgetch(int form), die einen Tastendruck entsprechend
- ** dem übergebenen Format form bewertet. Z.Zt. sind folgende
- ** Formate implementiert ( s. util.h ) :
- ** ALL (1) - Alle Character 0 - 255
- ** UPPER (2) - Buchstaben werden in GROSS konvertiert
- ** LOWER (3) - Buchstaben werden in klein konvertiert
- ** NUM (4) - Zahlen, '.', ',', '+', '-'
- ** DATUM (5) - Zahlen, '.', '/', '-'
- ** ZEIT (6) - Zahlen, '.', ':'
- ** readdate() stellt dem Aufrufer eine Maske des angeforder-
- ** ten Format zur Verfügung ( z.B. __.__.__ ), wobei die
- ** Unterstriche durch Zahlen gefüllt werden müssen. Die
- ** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
- ** nicht editierbar und werden automatisch erzeugt. Eine
- ** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
- ** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
- ** immer, hinter der letzten Position genügt ein beliebige
- ** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
- **
- ** Änderungen 1.00 ; 09.06.91
- ** - Erste Version
- ** 1.20 ; 21.07.91
- ** - Fehler im Korrekturteil beseitigt.
- ** - Variable int trenner = '.'||'/' eingefügt.
- ** - Berücksichtigung eines evtl. bereits eingegebenen
- ** ersten Zeichens (dazu Variable: int def_char).
- ** - Taste ESC (27) gibt jetzt einen NULL-Zeiger zurück
- ** ( tatsächlicher Abbruch !), während RETURN weiterhin
- ** den vorbelegten bzw. (teil-)ausgefüllten String liefert.
- */
-
- #include <stdio.h>
- #include <string.h>
- #ifdef __TURBOC__
- #define ANSI
- #define KR_SYS
- #include <stdlib.h>
- #include "datum.h"
- #include "util.h"
- #else
- #include "/u1/usr/include/datum.h"
- #include "/u1/usr/include/util.h"
- #endif
-
- #ifdef ANSI
- char *readdate(int format, char *dstring)
- #else
- char *readdate(format,dstring)
- int format;
- char *dstring;
- #endif
- {
- /* Variablendefinitionen :
- */
- int trennpos1 = 2, /* Positionen von Trennzeichen */
- trennpos2 = 5;
- int trenner; /* Trennzeichen */
- int pos = 0; /* Aktuelle Position */
- int maxpos = 11; /* Letztmögliche Position */
- int max = 0; /* Schalter, ob am Ende */
- int ch; /* Einzulesendes Zeichen */
- int def_char = '_'; /* Vorbelegungszeichen */
-
- /* Berücksichtigung eines bereits vorhandenen 1. Zeichens in dstring :
- */
- if ( dstring[0] == '\0' ) {
- dstring[0] = def_char;
- }
- else {
- pos = 1;
- }
-
-
- /* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
- */
- switch ( format ) {
- case DE_KURZ :
- trenner = 46;
- maxpos = 9;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- printf("%c_.__.__",dstring[0]);
- printf("\b\b\b\b\b\b\b");
- break;
- case DE_LANG :
- trenner = 46;
- maxpos = 11;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- printf("%c_.__.____",dstring[0]);
- printf("\b\b\b\b\b\b\b\b\b");
- break;
- case AM_KURZ :
- trenner = 47;
- maxpos = 9;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- printf("%c_/__/__",dstring[0]);
- printf("\b\b\b\b\b\b\b");
- break;
- case AM_LANG :
- trenner = 47;
- maxpos = 11;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- printf("%c_/__/____",dstring[0]);
- printf("\b\b\b\b\b\b\b\b\b");
- break;
- case DB_KURZ :
- maxpos = 7;
- trennpos1 =
- trennpos2 = 99;
- printf("%c_____",dstring[0]);
- printf("\b\b\b\b\b");
- break;
- case DB_LANG :
- maxpos = 9;
- trennpos1 =
- trennpos2 = 99;
- printf("%c_______",dstring[0]);
- printf("\b\b\b\b\b\b\b");
- break;
- case DE_AKTJAHR :
- trenner = 46;
- maxpos = 7;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- printf("%c_.__.",dstring[0]);
- printf("\b\b\b\b\b");
- break;
- case AM_AKTJAHR :
- trenner = 47;
- maxpos = 6;
- dstring[trennpos1] = trenner;
- trennpos2 = 99;
- printf("%c_/__",dstring[0]);
- printf("\b\b\b\b");
- break;
- default:
- trenner = 46;
- maxpos = 9;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- } /* ENDE: switch(format) */
-
- /* Evtl. noch ein BACKSPACE ausführen :
- */
- if ( !pos ) {
- printf("\b");
- }
-
- /* Tastendrucke abholen, bis maxpos :
- */
- while ( pos < maxpos + 1 ) {
-
- /* Falls fertig, String zurückgeben :
- */
- if ( pos == maxpos ) {
- dstring[pos] = '\0';
- return(dstring);
- }
- /* An eventuellen Trennerpositionen den passenden Trenner einfügen
- ** und den nächsten Schleifendurchlauf abwarten :
- */
- if ( pos == trennpos1 || pos == trennpos2 ) {
- printf("%c",dstring[trennpos1]);
- pos++;
- continue;
- }
-
- /* An der vorletzten Position sind alle Tasten erlaubt, denn nur
- ** BACKSPACE bleibt in der Funktion :
- */
- if ( pos == maxpos - 1 ) {
- max = 1;
- ch = editgetch(ALL);
- } /* pos < maxpos -1 */
- else
- ch = editgetch(DATUM);
-
- /* Auswertung der gedrückten Taste :
- */
- switch ( ch ) {
-
- /* Nicht Zulässiges ignorieren :
- */
- case NULL:
- case -1 :
- break;
-
- /* Abbruchmöglichkeiten :
- */
- case 27 :
- dstring[0] = '\0';
- return(dstring);
- case 10 :
- case 13 :
- dstring[pos] = '\0';
- return(dstring);
-
- /* Korrekturmöglichkeit :
- */
- case 8 :
- if ( pos == trennpos1 || pos == trennpos2 ) {
- dstring[pos] = trenner;
- }
- else {
- dstring[pos] = def_char;
- dstring[maxpos-1] = '\0';
- }
-
- /* Schalter für MAX-Position zurücksetzen :
- */
- if ( max )
- max = 0;
-
- /* Trenner überspringen und Maskendefault anzeigen :
- */
- if ( pos == trennpos1 + 1 || pos == trennpos2 + 1 ) {
- printf("\b\b_\b");
- pos -= 2;
- break;
- }
-
- /* Ansonsten zurück und Maskendefault anzeigen :
- */
- if ( pos ) {
- printf("\b_\b");
- pos--;
- }
- dstring[pos] = def_char;
-
- break;
- default :
- /* Falls wir fertig sind, String abschließen und
- ** zurückgeben :
- */
- if ( max ) {
- dstring[pos] = '\0';
- return(dstring);
- }
-
- /* Ansonsten ist es eine Zahl, die angezeigt und ein-
- ** getragen wird :
- */
- printf("%c",ch);
- dstring[pos] = ch;
- pos++;
-
- } /* ENDE: switch(ch) */
- } /* ENDE: while(pos) */
-
- return(dstring);
-
- } /* ENDE: readdate() */
-
-